// 统计一篇英文(The_Holy_Bible.txt)文章中出现的单词和词频。

// 输入：某篇文章的绝对路径

// 输出：词典文件dict.txt（词典中的内容为每一行都是一个“单词 词频”）

// 词典的存储格式如下。

// |   a 66          |
// |   abandon 77    |
// |   public 88     |
// |    ...........  |
// |_________________|
// 代码设计：
#include <cctype>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::ios;
using std::string;
using std::vector;
using std::ifstream;
using std::ofstream;

struct Record
{
	string _word;
	size_t _frequency;
};

class Dictionary
{
public:
    void read(const std::string &filename){
        cout << "void read(const std::string &filename)" << endl;
        ifstream ifs(filename);
        if(!ifs){cout << "文件打开错误" << endl; return;}
        string word;
        while(ifs >> word){
            // 除去特殊字符
            auto itsBegin = word.begin();
            auto itsEnd = word.end();
            while(itsBegin != itsEnd){
                if(isupper(*itsBegin)){
                    *itsBegin += 32;
                    itsBegin++;
                }else if(!isalpha(*itsBegin)){
                    word.erase(itsBegin);
                    itsEnd = word.end();
                    itsBegin = word.begin();
                }else{
                    itsBegin++;
                }   
            }
            if(word.size() == 0){continue;}
            
            // 判断是否存在
            auto itv = _dict.begin();
            for(; itv != _dict.end(); ++itv){
                if(itv->_word == word){
                    itv->_frequency++;
                    break;
                }
            }
            if(itv == _dict.end()){
                _dict.push_back({word, 1});
            }
        }
        ifs.close();
    }

    void store(const std::string &filename){
        ofstream ofs(filename);
        for(auto & R : _dict){
            ofs << " 单词: " << R._word;
            ofs << " 词频: " << R._frequency;
            ofs << endl;
        }
        ofs.close();
    }
    // void print(){
    //     for(auto& R : _dict){
    //         cout << " 单词: " << R._word;
    //         cout << " 词频: " << R._frequency;
    //         cout << endl;
    //     }
    // }
private:
    vector<Record> _dict;
};


// 提示：因为我们需要统计圣经文件中单词以及该单词在文件中出现的次数，所以可以看去读圣经文件，然后将单词存到数据结构中，并记录单词的次数，如果单词第二次出现的时候，只需要修改单词的次数（也就是这里说的单词的频率），这样当统计完整个圣经文件后，数据都存在数据结构vector了。接着遍历vector数据结构就可以将单词以及单词次数(也就是频率)存储到另外一个文件。(当然如果不存到另外一个文件，就只能打印到终端了)

// 注意：在读圣经文件的时候，有可能字符串是不合法的，比如：abc123 abc？这样的字符串，处理方式两种：直接不统计这样的字符串或者将非法字母去掉即可。

int main(void)
{
    Dictionary D;
    D.read("The_Holy_Bible.txt");

    // D.print();
    D.store("a.txt");
}

